﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using B2BAktarim.VeriServisi;

namespace B2BAktarim
{
    public class Mikro
    {
        public Mikro()
        {
            CnnString();
        }
        private string CnnStr { get; set; }
        private void CnnString()
        {
            if (Settings.Instance.GetValue(Information.OturumAcmaSekli) == "Sql")
                CnnStr = string.Format("Data Source={0};Database={1};user id={2};password={3}", Settings.Instance.GetValue(Information.SunucuAdi), Settings.Instance.GetValue(Information.Veritabani), Settings.Instance.GetValue(Information.KullaniciAdi), Settings.Instance.GetValue(Information.Sifre));
            else
                CnnStr = string.Format("Data Source={0};Initial Catalog={1};Integrated Security=SSPI;", Settings.Instance.GetValue(Information.SunucuAdi), Settings.Instance.GetValue(Information.Veritabani));
        }
        public List<SyncKategori> KategoriList(DateTime tarih)
        {
            List<SyncKategori> sonuc = new List<SyncKategori>();
            using (SqlConnection cn = new SqlConnection(CnnStr))
            {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand("SELECT     ktg_RECno, ktg_kod, ktg_isim   FROM         STOK_KATEGORILERI where ktg_lastup_date >= @tarih", cn))
                {
                    cmd.Parameters.Add("@tarih", SqlDbType.DateTime).Value = tarih;
                    SqlDataReader rd = cmd.ExecuteReader();
                    while (rd.Read())
                    {
                        sonuc.Add(new SyncKategori() { ID = rd.GetInt32(0), Kodu = rd.GetString(1), Adi = rd.GetString(2) });
                    }
                }
                cn.Close();
            }
            return sonuc;
        }

        public List<SyncAltGrup> AltGrupList(DateTime tarih)
        {
            List<SyncAltGrup> sonuc = new List<SyncAltGrup>();
            using (SqlConnection cn = new SqlConnection(CnnStr))
            {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand("SELECT     sta_RECno, sta_kod, sta_isim FROM         STOK_ALT_GRUPLARI where sta_lastup_date >= @tarih", cn))
                {
                    cmd.Parameters.Add("@tarih", SqlDbType.DateTime).Value = tarih;
                    SqlDataReader rd = cmd.ExecuteReader();
                    while (rd.Read())
                    {
                        sonuc.Add(new SyncAltGrup() { ID = rd.GetInt32(0), Kodu = rd.GetString(1), Adi = rd.GetString(2) });
                    }
                }
                cn.Close();
            }
            return sonuc;
        }

        public List<SyncStok> StokList(DateTime tarih)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("SELECT     sto_RECno, sto_kod, sto_isim, sto_perakende_vergi, dbo.fn_VergiYuzde(sto_perakende_vergi) AS kdvoran,");
            sb.Append("                          (SELECT     Data");
            sb.Append("                            FROM          mye_ImageData ");
            sb.Append("                            WHERE      (TableID = 13) AND (RecID_RECno = STOKLAR.sto_RECno) AND (ImageID = 0)) AS resim, sto_kategori_kodu, sto_doviz_cinsi,dbo.fn_StokSatisFiyati(sto_kod,1,0) as fiyat,isnull(sto_altgrup_kod,' ') ");
            sb.Append(" FROM         STOKLAR where sto_lastup_date >= @tarih");

            List<SyncStok> sonuc = new List<SyncStok>();
            using (SqlConnection cn = new SqlConnection(CnnStr))
            {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand(sb.ToString(), cn))
                {
                    cmd.Parameters.Add("@tarih", SqlDbType.DateTime).Value = tarih;
                    SqlDataReader rd = cmd.ExecuteReader();
                    while (rd.Read())
                    {
                        SyncStok stk = new SyncStok();
                        stk.ID = rd.GetInt32(0);
                        stk.Kodu = rd.GetString(1);
                        stk.Adi = rd.GetString(2);
                        stk.KdvID = rd.GetByte(3);
                        stk.KdvOrani = rd.GetDouble(4);
                        if (rd["resim"] != DBNull.Value)
                            stk.Resim = (byte[])rd["resim"];
                        stk.KategoriKodu = rd.GetString(6);
                        stk.DovizCinsi = rd.GetByte(7);
                        stk.Degisti = false;
                        stk.Silindi = false;
                        stk.Fiyat = rd.GetDouble(8);
                        stk.AltGrupKodu = rd.GetString(9);
                        sonuc.Add(stk);
                    }
                }
                cn.Close();
            }
            return sonuc;
        }
        public List<SyncCari> CariList(DateTime tarih)
        {
            List<SyncCari> sonuc = new List<SyncCari>();
            using (SqlConnection cn = new SqlConnection(CnnStr))
            {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand("SELECT     cari_RECno, cari_kod, cari_unvan1 + ' ' + cari_unvan2 AS unvan FROM         CARI_HESAPLAR where cari_lastup_date >= @tarih", cn))
                {
                    cmd.Parameters.Add("@tarih", SqlDbType.DateTime).Value = tarih;
                    SqlDataReader rd = cmd.ExecuteReader();
                    while (rd.Read())
                    {
                        sonuc.Add(new SyncCari() { ID = rd.GetInt32(0), Kodu = rd.GetString(1), Adi = rd.GetString(2), Degisti = false, Silindi = false });
                    }
                }
                cn.Close();
            }
            return sonuc;
        }
        public List<SyncDovizKuru> DovizList()
        {
            List<SyncDovizKuru> sonuc = new List<SyncDovizKuru>();
            using (SqlConnection cn = new SqlConnection(CnnStr))
            {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand("select dov_RECno,dov_no,dov_fiyat2 from MikroDB_V14.dbo.DOVIZ_KURLARI where (dov_tarih=(select max(dov_tarih) from MikroDB_V14.dbo.DOVIZ_KURLARI)) and dov_no < 3", cn))
                {
                    SqlDataReader rd = cmd.ExecuteReader();
                    while (rd.Read())
                    {
                        sonuc.Add(new SyncDovizKuru() { ID = rd.GetInt32(0), DovizCinsi = rd.GetByte(1), Kur = rd.GetDouble(2) });
                    }
                }
                cn.Close();
            }
            return sonuc;
        }

        private string[] CariFiyatListe(DateTime tarih)
        {
            List<string> liste = new List<string>();
            using (SqlConnection cn = new SqlConnection(CnnStr))
            {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand("SELECT     sat_cari_kod FROM         SATIS_SARTLARI where sat_lastup_date >= @tarih GROUP BY sat_cari_kod", cn))
                {
                    cmd.Parameters.Add("@tarih", SqlDbType.DateTime).Value = tarih;
                    SqlDataReader rd = cmd.ExecuteReader();
                    while (rd.Read())
                    {
                        liste.Add(rd.GetString(0));
                    }
                    rd.Close();
                }
                cn.Close();
            }
            return liste.ToArray();
        }

        public List<SyncFiyatListesi> FiyatList(DateTime tarih)
        {
            List<SyncFiyatListesi> sonuc = new List<SyncFiyatListesi>();
            using (SqlConnection cn = new SqlConnection(CnnStr))
            {
                cn.Open();
                string cmdtext="SELECT top 1 sat_evrakno_seri,sat_evrakno_sira FROM SATIS_SARTLARI WITH (NOLOCK) WHERE (sat_cari_kod = @cari) AND (sat_basla_tarih <= getdate()) AND (sat_bitis_tarih >= getdate() OR sat_bitis_tarih <= getdate()) ORDER BY sat_depo_no DESC, sat_basla_tarih DESC, sat_RECno DESC, sat_bitis_tarih DESC";
                using (SqlCommand cmd = new SqlCommand(cmdtext, cn))
                {
                    foreach (string cari in CariFiyatListe(tarih))
                    {
                        #region Seri numara okuma
                        cmd.CommandText = cmdtext;
                        cmd.Parameters.Clear();
                        cmd.Parameters.Add("@cari", SqlDbType.NVarChar, 25).Value = cari;
                        SqlDataReader rd = cmd.ExecuteReader();
                        string seri = "";
                        int sira = 0;
                        while (rd.Read())
                        {
                            seri = rd[0].ToString();
                            sira = Convert.ToInt32(rd[1]);
                        }
                        rd.Close();
                        #endregion

                        cmd.Parameters.Clear();
                        cmd.CommandText = "SELECT     sat_RECno, sat_cari_kod, sat_stok_kod, sat_brut_fiyat, sat_det_isk_yuzde1, sat_det_isk_yuzde2, sat_det_isk_yuzde3, sat_det_isk_yuzde4, sat_det_isk_yuzde5,sat_det_isk_yuzde6, sat_det_isk_miktar1, sat_det_isk_miktar2, sat_det_isk_miktar3, sat_det_isk_miktar4, sat_det_isk_miktar5, sat_det_isk_miktar6,sat_doviz_cinsi FROM         SATIS_SARTLARI WHERE     (sat_evrakno_seri = @seri) AND (sat_evrakno_sira = @sira)";
                        cmd.Parameters.Add("@seri", SqlDbType.NVarChar, 6).Value = seri;
                        cmd.Parameters.Add("@sira", SqlDbType.Int).Value = sira;
                        rd = cmd.ExecuteReader();
                        while (rd.Read())
                        {
                            sonuc.Add(new SyncFiyatListesi()
                            {
                                ID = rd.GetInt32(0),
                                CariKodu = rd.GetString(1),
                                StokKodu = rd.GetString(2),
                                BrutFiyat = rd.GetDouble(3),
                                Isk1Oran = rd.GetDouble(4),
                                Isk2Oran = rd.GetDouble(5),
                                Isk3Oran = rd.GetDouble(6),
                                Isk4Oran = rd.GetDouble(7),
                                Isk5Oran = rd.GetDouble(8),
                                Isk6Oran = rd.GetDouble(9),
                                Isk1Tutar = rd.GetDouble(10),
                                Isk2Tutar = rd.GetDouble(11),
                                Isk3Tutar = rd.GetDouble(12),
                                Isk4Tutar = rd.GetDouble(13),
                                Isk5Tutar = rd.GetDouble(14),
                                Isk6Tutar = rd.GetDouble(15),
                                DovizCinsi = rd.GetByte(16)
                            });
                        }
                        rd.Close();
                    }
                }
                cn.Close();
            }
            return sonuc;
        }
        public void SiparisEkle(SqlTransaction trn, Siparis spr)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("DECLARE ");
            sb.Append(" @Record_id int, ");
            sb.Append(" @kdv_oran float, ");
            sb.Append(" @kdv_tutar float ");
            sb.Append(" set @kdv_oran=dbo.fn_VergiYuzde(@Kdv) ");
            sb.Append(" set @kdv_tutar = (@yekun - (@isk1_tutar+@isk2_tutar+@isk3_tutar+@isk4_tutar+@isk5_tutar)) * @kdv_oran / 100 ");
            sb.Append(" if exists(SELECT     sip_evrakno_seri  FROM         SIPARISLER  WHERE     (sip_evrakno_seri = @Seri) AND (sip_evrakno_sira =@Sira) AND (sip_satirno = @Satir) AND (sip_tip = 0) AND (sip_cins=0)) ");
            sb.Append(" 	begin ");
            sb.Append(" 		UPDATE SIPARISLER SET ");
            sb.Append(" 									sip_lastup_user=@kullanici, sip_lastup_date=@Evrak_Tarih, sip_tarih=@Evrak_Tarih, sip_teslim_tarih=@Evrak_Tarih, sip_tip=0, sip_cins=0, sip_evrakno_seri=@Seri,   ");
            sb.Append("                                        sip_evrakno_sira=@Sira, sip_satirno=@Satir, sip_belge_tarih=@Evrak_Tarih, sip_musteri_kod=@Cari_kod, sip_stok_kod=@Stok_kod, sip_b_fiyat= @Fiyat, sip_miktar=@Miktar, sip_teslim_miktar=0, sip_tutar=@yekun , sip_iskonto_1=@isk1_tutar, sip_iskonto_2=@isk2_tutar, sip_iskonto_3=@isk3_tutar, sip_iskonto_4=@isk4_tutar, sip_iskonto_5=@isk5_tutar , sip_vergi_pntr=@Kdv,sip_vergi=@kdv_tutar, ");
            sb.Append("                                         sip_opno=0, sip_depono=@GirisDepo, sip_vergisiz_fl=0, sip_kapat_fl=0, sip_doviz_cinsi=@doviz_cinsi, sip_doviz_kuru=@doviz_kur, sip_alt_doviz_kuru=1, sip_adresno=0, sip_cagrilabilir_fl=1,   ");
            sb.Append("                                        sip_prosiprecDbId=0, sip_prosiprecrecI=0, sip_durumu=0, sip_stalRecId_DBCno=0, sip_stalRecId_RECno=0, sip_planlananmiktar=0,sip_iskonto1=1, sip_iskonto2=1, sip_iskonto3=1, sip_iskonto4=1, sip_iskonto5=1,sip_stok_sormerk=@srmerkez,sip_cari_sormerk=@srmerkez,sip_belgeno=@belge_no,sip_firmano=@firma_no,sip_subeno=@sube_no,sip_birim_pntr=1 ");
            sb.Append(" 		WHERE     (sip_evrakno_seri = @Seri) AND (sip_evrakno_sira =@Sira) AND (sip_satirno = @Satir) AND (sip_tip = 0) AND (sip_cins=0) ");
            sb.Append(" 	end ");
            sb.Append(" else ");
            sb.Append(" 	begin ");
            sb.Append(" 		INSERT INTO SIPARISLER   ");
            sb.Append("                                       (sip_RECid_DBCno, sip_RECid_RECno, sip_SpecRECno, sip_iptal, sip_fileid, sip_hidden, sip_kilitli, sip_checksum, sip_create_user,   ");
            sb.Append("                                        sip_create_date, sip_lastup_user, sip_lastup_date, sip_tarih, sip_teslim_tarih, sip_tip, sip_cins, sip_evrakno_seri,   ");
            sb.Append("                                        sip_evrakno_sira, sip_satirno, sip_belge_tarih, sip_musteri_kod, sip_stok_kod, sip_b_fiyat, sip_miktar, sip_teslim_miktar, sip_tutar , sip_iskonto_1, sip_iskonto_2, sip_iskonto_3, sip_iskonto_4, sip_iskonto_5, sip_vergi_pntr,sip_vergi, ");
            sb.Append("                                         sip_opno, sip_depono, sip_vergisiz_fl, sip_kapat_fl, sip_doviz_cinsi, sip_doviz_kuru, sip_alt_doviz_kuru, sip_adresno, sip_cagrilabilir_fl,   ");
            sb.Append("                                        sip_prosiprecDbId, sip_prosiprecrecI, sip_durumu, sip_stalRecId_DBCno, sip_stalRecId_RECno, sip_planlananmiktar,sip_iskonto1, sip_iskonto2, sip_iskonto3, sip_iskonto4, sip_iskonto5,sip_stok_sormerk,sip_cari_sormerk,sip_belgeno,sip_firmano,sip_subeno,sip_birim_pntr)  ");
            sb.Append("                         VALUES     (0,0, 0, 0, 21, 0, 0, 0, @kullanici,@Evrak_Tarih, @kullanici,@Evrak_Tarih,@Evrak_Tarih,@Evrak_Tarih, 0, 0, @Seri,@Sira,@Satir,@Evrak_Tarih,@Cari_kod,@Stok_kod, @Fiyat  , @Miktar  , 0, @yekun  , @isk1_tutar  , @isk2_tutar  , @isk3_tutar  , @isk4_tutar  , @isk5_tutar  ,@Kdv,@kdv_tutar, 0,@GirisDepo, 0, 0, @doviz_cinsi, @doviz_kur, 1, 0, 1, 0, 0, 0, 0, 0, 0,1,1,1,1,1,@srmerkez,@srmerkez,@belge_no,@firma_no,@sube_no,1) ");
            sb.Append(" 		SELECT @Record_id=SCOPE_IDENTITY() ");
            sb.Append(" 		UPDATE    SIPARISLER    SET   sip_RECid_RECno = @Record_id  WHERE    sip_RECno = @Record_id ");
            sb.Append(" 	end ");

            using (SqlCommand cmd = new SqlCommand(sb.ToString(), trn.Connection) { Transaction = trn })
            {
                cmd.Parameters.Add("@Evrak_Tarih", SqlDbType.DateTime).Value = new DateTime(spr.Tarih.Year, spr.Tarih.Month, spr.Tarih.Day);
                cmd.Parameters.Add("@Seri", SqlDbType.VarChar).Value = spr.Seri;
                cmd.Parameters.Add("@Sira", SqlDbType.Int).Value = spr.Sira;
                cmd.Parameters.Add("@Satir", SqlDbType.Int).Value = spr.Satir;
                cmd.Parameters.Add("@Stok_kod", SqlDbType.VarChar).Value = spr.StokKodu;
                cmd.Parameters.Add("@Cari_kod", SqlDbType.VarChar).Value = spr.CariKodu;
                cmd.Parameters.Add("@Miktar", SqlDbType.Decimal).Value = spr.Miktar;
                cmd.Parameters.Add("@GirisDepo", SqlDbType.Int).Value = Settings.Instance.GetValue(Information.DepoKodu);
                cmd.Parameters.Add("@CikisDepo", SqlDbType.Int).Value = Settings.Instance.GetValue(Information.DepoKodu);
                cmd.Parameters.Add("@plasiyer", SqlDbType.VarChar).Value = "";
                cmd.Parameters.Add("@srmerkez", SqlDbType.VarChar).Value = "";
                cmd.Parameters.Add("@kullanici", SqlDbType.VarChar).Value = "1";
                cmd.Parameters.Add("@yekun", SqlDbType.Decimal).Value = spr.Tutar;
                cmd.Parameters.Add("@isk1_tutar", SqlDbType.Decimal).Value = spr.Iskonto1;
                cmd.Parameters.Add("@isk2_tutar", SqlDbType.Decimal).Value = spr.Iskonto2;
                cmd.Parameters.Add("@isk3_tutar", SqlDbType.Decimal).Value = spr.Iskonto3;
                cmd.Parameters.Add("@isk4_tutar", SqlDbType.Decimal).Value = spr.Iskonto4;
                cmd.Parameters.Add("@isk5_tutar", SqlDbType.Decimal).Value = spr.Iskonto5;
                cmd.Parameters.Add("@Kdv", SqlDbType.Int).Value = spr.KdvID;
                cmd.Parameters.Add("@Fiyat", SqlDbType.Decimal).Value = spr.Fiyat;
                cmd.Parameters.Add("@belge_no", SqlDbType.VarChar, 25).Value = "";
                cmd.Parameters.Add("@firma_no", SqlDbType.Int).Value = 0;
                cmd.Parameters.Add("@sube_no", SqlDbType.Int).Value = 0;
                cmd.Parameters.Add("@doviz_cinsi", SqlDbType.Int).Value = 0;
                cmd.Parameters.Add("@doviz_kur", SqlDbType.Float).Value = 1;
                cmd.ExecuteNonQuery();
            }

        }
        public SqlTransaction OpenTrn()
        {
            SqlConnection cn = new SqlConnection(CnnStr);
            cn.Open();
            return cn.BeginTransaction();
        }
    }
}
